// Package routes 注册路由
package routes

import (
	controllers "api/app/http/controllers/api/v1"
	"api/app/http/controllers/api/v1/auth"
	"api/app/http/middlewares"
	"api/pkg/config"

	"github.com/gin-gonic/gin"
)

// RegisterAPIRoutes 注册网页相关路由
func RegisterAPIRoutes(r *gin.Engine) {
	// 测试一个 v1 的路由组，我们所有的 v1 版本的路由都将存放到这里
	var v1 *gin.RouterGroup
	if len(config.Get("app.api_domain")) == 0 {
		v1 = r.Group("/api/v1")
	} else {
		v1 = r.Group("/v1")
	}
	v1.Use(middlewares.LimitIP("1000-H"))
	{
		authGroup := v1.Group("/auth", middlewares.LimitIP("1000-H"))
		{

			// 注册
			signup := authGroup.Group("/signup", middlewares.GuestJWT())
			{
				suc := new(auth.SignupController)
				// 判断手机是否已注册
				signup.POST("/phone/exist", middlewares.LimitPerRoute("60-H"), suc.IsPhoneExist)
				// 判断 Email 是否已注册
				signup.POST("/email/exist", middlewares.LimitPerRoute("60-H"), suc.IsEmailExist)
				//短信验证码 + 手机号注册
				signup.POST("/using-phone", suc.SignupUsingPhone)
				//Email + 邮件验证码注册
				signup.POST("/using-email", suc.SignupUsingEmail)
			}

			// 发送验证码
			verify := authGroup.Group("/verify-codes")
			{
				vcc := new(auth.VerifyCodeController)
				// 图片验证码，需要加限流
				verify.POST("/captcha", middlewares.LimitPerRoute("50-H"), vcc.ShowCaptcha)
				// （需要通过图片验证码）发送短信验证码
				verify.POST("/phone", middlewares.LimitPerRoute("20-H"), vcc.SendUsingPhone)
				// （需要通过图片验证码）发送邮箱验证码
				verify.POST("/email", middlewares.LimitPerRoute("20-H"), vcc.SendUsingEmail)
			}

			// 登录
			login := authGroup.Group("/login")
			{
				lgc := new(auth.LoginController)
				// 使用手机号，短信验证码进行登录
				login.POST("/using-phone", middlewares.GuestJWT(), lgc.LoginByPhone)
				// 支持手机号，Email 和 用户名密码登录
				login.POST("/using-password", middlewares.GuestJWT(), lgc.LoginByPassword)
				// 更新token
				login.POST("/refresh-token", middlewares.AuthJWT(), lgc.RefreshToken)
			}

			// 重置密码
			password := authGroup.Group("/password-reset", middlewares.GuestJWT())
			{
				pwc := new(auth.PasswordController)
				// 通过手机找回密码
				password.POST("/using-phone", pwc.ResetByPhone)
				// 通过邮箱找回密码
				password.POST("/using-email", pwc.ResetByEmail)
			}

			user := authGroup.Group("/user", middlewares.AuthJWT())
			{
				uc := new(controllers.UsersController)
				// 获取当前用户
				user.GET("", uc.CurrentUser)
				// 获取全部用户
				user.GET("/users", uc.Index)
				// 编辑个人资料
				user.PUT("", uc.UpdateProfile)
				// 修改电子邮箱
				user.PUT("/email", uc.UpdateEmail)
				// 修改手机号
				user.PUT("/phone", uc.UpdatePhone)
				// 修改密码
				user.PUT("/password", uc.UpdatePassword)
				// 修改头像
				user.PUT("/avatar", uc.UpdateAvatar)
			}

			cgcGroup := v1.Group("/categories", middlewares.AuthJWT())
			{
				cgc := new(controllers.CategoriesController)
				// 获取分类列表
				cgcGroup.GET("", cgc.Index)
				// 创建分类
				cgcGroup.POST("", cgc.Store)
				// 更新分类
				cgcGroup.PUT("/:id", cgc.Update)
				// 删除分类
				cgcGroup.DELETE("/:id", cgc.Delete)
			}

			tpcGroup := v1.Group("/topics", middlewares.AuthJWT())
			{
				tpc := new(controllers.TopicsController)
				// 话题列表
				tpcGroup.GET("", tpc.Index)
				// 显示话题
				tpcGroup.GET("/:id", tpc.Show)
				// 创建话题
				tpcGroup.POST("", tpc.Store)
				// 更新话题
				tpcGroup.PUT("/:id", middlewares.AuthJWT(), tpc.Update)
				// 删除话题
				tpcGroup.DELETE("/:id", middlewares.AuthJWT(), tpc.Delete)
			}

			linksGroup := v1.Group("/links")
			{
				lsc := new(controllers.LinksController)
				// 链接列表
				linksGroup.GET("", lsc.Index)
			}
		}
	}
}
